Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 31

0
votes
answers
49 views
+10

分配舊的對象,以新對象的ID將將它插入重複@ManyToMany

0

我在我的類中的單向@ManyToMany關係,具體如下:分配舊的對象,以新對象的ID將將它插入重複@ManyToMany

@ManyToMany(cascade = { 
     CascadeType.MERGE, 
     CascadeType.PERSIST 
}) 
@JoinTable(
     name=TABLE_NAME_JOB_JOB_TYPE, 
     [email protected](name=COLUMN_JOB_ID, referencedColumnName = COLUMN_JOB_ID), 
     inverseJoinColumns = @JoinColumn(name=COLUMN_JOB_TYPE_ID, referencedColumnName = COLUMN_JOB_TYPE_ID) 
) 
@Fetch(FetchMode.JOIN) 
private Set<JobTypeModel> types; 

我有一個很難更新作業類型的數量,一個工作,因爲一個簡單的錯誤,我終於找到了。 但是,我不知道爲什麼會發生這種情況。

基本上,我做了什麼,是我有一個方法合併舊的和新的工作,而不是採取從newJob的一切,並添加到oldJob,我採用oldJob的ID,並將其分配給newJob 。

所以,像這樣:

public JobModel mergeAndUpdate(JobModel oldJob, JobModel newJob) { 
    getLoggerService().debug(this.getClass().getSimpleName(), "mergeAndUpdate({oldJob}, {newJob})"); 
    //newJob.setId(oldJob.getId()); //If doing this, then it fails 
    //Was trying to avoid doing this: 
    oldJob.setX(newJob.getX()); 
    oldJob.setY(newJob.getY()); 
    oldJob.setZ(newJob.getZ()); 

    return getJobRepository().saveAndFlush(oldJob); 
    //return getJobRepository().saveAndFlush(newJob); 
} 

我JobRepository是延伸org.springframework.data.jpa.repository.JpaRepository

做這件事時,試圖堅持更新(要麼加一,或一個刪除jobType)時的界面,它會失敗。

當添加一個新的jobType時,它會告訴我在關聯表JOB_JOB_TYPE中有一個重複的條目。

Hibernate: insert into job_job_type (job_id, job_type_id) values (?, ?) 
2017-11-26 00:02:28.202 WARN 74560 --- [p-nio-80-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1062, SQLState: 23000 
2017-11-26 00:02:28.202 ERROR 74560 --- [p-nio-80-exec-6] o.h.engine.jdbc.spi.SqlExceptionHelper : Duplicate entry '187-2' for key 'PRIMARY' 
2017-11-26 00:02:28.203 INFO 74560 --- [p-nio-80-exec-6] o.h.e.j.b.internal.AbstractBatchImpl  : HHH000010: On release of batch it still contained JDBC statements 

從作業集中刪除jobType並保留新作業時,什麼都不會發生 - >關係仍然會保留。

有人知道爲什麼嗎?這樣做,對於沒有@ManyToMany關係的對象(即將舊對象的ID添加到新對象中,而不是將新對象中的所有其他對象添加到舊對象,都將嘗試更新,調用saveAndFlush方法時

我使用: MariaDB的28年1月10日 春季啓動1.5.4(與相關的彈簧引導啓動數據JPA)

+0

行爲對我來說是持久的,在邏輯上,您必須先刪除舊記錄(使用X id),以添加具有相同ID的新記錄。也許嘗試保存字段'整數臨時'id值,刪除舊記錄,並嘗試從'臨時'添加新的ID – newOne

+0

這意味着兩個查詢。我解決問題的方式只使用一個查詢。我只想知道爲什麼其他方法不起作用,並解釋實際發生的情況。而且由於我無法找到任何地方,這個具體問題,我認爲這也可以幫助其他人。 –

沙发
0
0

底線是DB負責。讓它爲你創建所有的ID,不要嘗試在對象上設置ID,如果你插入一個NEW記錄,你可以插入wi th null ID和DB將分配ID,並且在插入課程之前您將不知道ID。但是重要的是,如果你持久保存一個記錄,那就是HJ和ID(在POJO對象上),那麼你需要確定它正在執行'update'操作而不是'insert',否則你會遇到這個問題。

+0

當調用'saveAndFlush'時,它會進行更新。所以如果我設置了一個ID,它會進行更新。如果我從數據庫中獲取記錄,將其映射到對象,該對象還將包含一個ID。如果我更改了上述對象上的其他內容,並保持ID不變,則它會正確執行更新。但是在這裏,我們正在討論@ManyToMany關係,更新發生在父表中,但不會發生在關聯表中。 –

+1

查找「級聯」。如果沒有明顯的級聯方式,您可能需要對兩個表進行手動更新。我在@ManyToMany生鏽而在此之前 https://stackoverflow.com/questions/946938/jpa-manytomany-writing-on-create-but-not-update 都做到了和谷歌這種「彈簧更新@manytomany「:P該搜索將獲得大量命中。 – 2017-11-26 00:25:11

41
votes
answers
34 views
+10

Not allowed to create transaction on shared EntityManager - use Spring transactions or EJB CMT

This post is in continuation of JPA How to get the value from database after persist

When I execute the following I am getting following exception, how can I resolve this?

Not allowed to create transaction on shared EntityManager - use Spring 
transactions or EJB CMT

DAOImpl code

public void create(Project project) {
        entityManager.persist(project);
        entityManager.getTransaction().commit();
        project = entityManager.find(Project.class, project.getProjectId());
        entityManager.refresh(project);
        System.out.println("Id    -- " + project.getProjectId());
            System.out.println("no -- " + project.getProjectNo());
    }

applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <bean id="DataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="username" value="scott" />
        <property name="password" value="tiger" />
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="jdbc:oracle:thin:@myserver:1521:ORCL" />
    </bean>

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="DataSource" />
        <property name="packagesToScan" value="test.entity" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
                <property name="generateDdl" value="false" />
                <property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect" />
            </bean>
        </property>
    </bean>

    <context:component-scan base-package="test.net" />

    <tx:annotation-driven transaction-manager="transactionManager"/> 

     <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>         

     <context:annotation-config/>

</beans>
up vote 38 down vote accepted favorite
沙发
+380
+50

我想這裡的問題是雖然你已經為事務管理器定義了bean,但是你還沒有用 @Transactional 註釋create()方法,它啟用了spring事務。

同樣刪除 entityManager.getTransaction()。commit(); 語句,因為現在所有的事務管理都將由spring處理,如果您保留語句,那麼您將得到相同的再次出錯。

當你使用@PersistenceContext自動裝入entitymanager時,即使我使用Transactional註釋方法並刪除提交語句,我仍然會得到相同的錯誤 - Maurice Aug 9 '18 at 18:46

+30

在方法上註入EntityManagerFactory而不是EntityManager和javax.transaction.Transactional註釋解決了我的問題,如下所示。

  // Autowire EntityManagerFactory @PersistenceUnit(unitName =“readwrite.config”)private EntityManagerFactory entityManagerFactory; //在創建/更新上使用以下代碼EntityManager entityManager = entityManagerFactory.createEntityManager(); entityManager.getTransaction()()開始。if(!ObjectUtils.isEmpty(entity)&amp;&amp;!entityManager.contains(entity)){entityManager.persist(entity); entityManager.flush(); } entityManager.getTransaction()。commit();  
     
			
        

這解決了我的問題但我唯一的問題是我們是否可以將entityManagerFactory中的entityManager作為類成員屬性創建並在我的dao類中使用的不同方法中使用它? - Shilan 2月25日13:12

42
votes
answers
36 views
+10

org.hibernate.ObjectNotFoundException: No row with the given identifier exists, but it DOES

I've got a hibernate problem that I can't fix.

The setup: Java EE, web app, Hibernate 3.2, Tomcat 6, Struts 2.

Basically, I persist an object with my server logic (a struts action), then try and pull that data out for the next page and display it.

I check the database after I save the object, and sure enough, I can see the row there with all the data.

But when I try and retrieve it I get this:

org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [msc.model.Picture#73]

To make things even muddier, when I restart Tomcat and try and access the same object, I don't get the error - Hibernate finds the row just fine.

Hibernate will also be able to see the row if I do some other operations - maybe add a row here and there to the database, not even on the same table.

From all this I suspect a Hibernate bug, but I'm a Hibernate newbie so I am probably wrong. Please help! I've googled and googled to no avail.

Here is my Hibernate config:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/msc</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">-------</property>
        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">80</property>
        <property name="current_session_context_class">thread</property>
        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>
        <mapping resource="msc/model/Picture.hbm.xml"/>
        <mapping resource="msc/model/Comment.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

Here are my two mapping files:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="msc.model.Picture" table="PICTURE">
    <id column="PICTURE_ID" name="id">
      <generator class="native"/>
    </id>
    <property name="story"/>
    <property name="email"/>
    <property name="category"/>
    <property name="state"/>
    <property name="ratings"/>
    <property name="views"/>
    <property name="timestamp"/>
    <property name="title"/>
    <property lazy="true" name="image" type="blob">
      <column name="IMAGE"/>
    </property>
    <property lazy="true" name="refinedImage" type="blob">
      <column name="REFINEDIMAGE"/>
    </property>
    <property lazy="true" name="thumbnail" type="blob">
      <column name="THUMBNAIL"/>
    </property>
    <bag cascade="save-update" lazy="true" name="comments" table="COMMENT">
      <key column="PICTURE"/>
      <one-to-many class="msc.model.Comment"/>
    </bag>
  </class>
</hibernate-mapping>

and

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <class name="msc.model.User" table="USER">
    <id column="USER_ID" name="id">
      <generator class="native"/>
    </id>
    <property name="username"/>
    <property name="email"/>
    <bag cascade="save-update" lazy="true" name="pictures" table="PICTURE">
      <key column="USER"/>
      <one-to-many class="msc.model.Picture"/>
    </bag>
    <bag cascade="save-update" lazy="true" name="comments" table="COMMENT">
      <key column="USER"/>
      <one-to-many class="msc.model.Comment"/>
    </bag>
  </class>
</hibernate-mapping>

Please let me know if you need more info, I'm happy to oblige.

(note: this is not a duplicate of this question, the scenario is not the same "No row with the given identifier exists" although it DOES exist)

EDIT: as requested, posting Java code:

Code to save object

Session hib_ses = HibernateUtil.getSessionFactory().getCurrentSession();

hib_ses.beginTransaction();

hib_ses.save(user);

hib_ses.getTransaction().commit(); 

Code to display data (an image in this case)

public class ImageAction extends ActionSupport implements ServletResponseAware, SessionAware {

    private HttpServletResponse response;
    Map session;
    private Long id;
    private int thumbnail;
    private InputStream inputStream;

    @Override
    public String execute() throws Exception {
        response.setContentType("image/jpeg");
        Session hib_session = HibernateUtil.getSessionFactory().getCurrentSession();
        hib_session.beginTransaction();

        //what is the ID now?
        Picture pic = (Picture) hib_session.load(Picture.class, getId());

        if (thumbnail == 1) {
            inputStream = (ByteArrayInputStream) pic.getThumbnail().getBinaryStream();
        } else {
            inputStream = (ByteArrayInputStream) pic.getRefinedImage().getBinaryStream();
        }

        hib_session.close();
        return SUCCESS;
    }
沙发
+160

檢查所有映射和數據庫設置。當您的數據庫顯示nullable =“true”時,您可能在外鍵關係中設置了一些not-null =“true”。第一個導致INNER JOIN而第二個導致LEFT JOIN。

將日誌級別設置為TRACE以查看所有步驟並在檢索對象時查找生成的SQL。

板凳
+160

這是因為您插入了一些外鍵但不引用任何內容。檢查數據庫是否存在該密鑰(即使它存在於其他表中的數據庫中)。

我確認,至少在我的情況下,這就是問題所在。 - borjab 2014年7月11日16:05

這是非常重要的檢查,我的數據庫有這個問題,如果我們沒有意識到這個問題會讓我們陷入困境 - Uriel Arvizu 2016年6月27日17:05

地板
+50

只需檢查您的數據庫是否在您的特定表格中提供了ID 73

4楼
+30

在多對一關係中,如果找不到映射的行,您需要告訴Hibernate需要做什麼。您可以通過以下方式對其進行配置:

 註釋:@NotFound(action = NotFoundAction.IGNORE)映射XML:&lt;多對一名稱=“user”column =“user_id” class =“com.xyz.User”cascade =“save-update,evict”not-found =“ignore”/&gt;  
     
			
        

這救了我的命!謝謝! - jkabugu 2017年2月28日23:45

5楼
+20

好的,我要在這裡拋出一個理論。可能是您在提交事務之前第一次嘗試加載圖片嗎?

由於事務尚未提交,因此該行不可見你用來讀取圖片的事務(取決於你的事務隔離級別)。

然後,因為 hib_session.close()不在 finally < / code> block,它不會被執行,並且線程綁定會話仍然會有一個打開的事務。後續請求獲得相同的 Hibernate會話,具有相同的開放事務,並且您從select it問題中獲得相同的結果(再次,取決於事務隔離級別 - 請參閱

理論似乎很有希望,當我在我的代碼中應用調試點時一切正常。這意味著hibernate有時間提交事務(我認為)!! - 不是錯誤2016年1月25日10:12

6楼
0

我沒有看到任何與代碼中的異常有關的實際問題,您可能想嘗試:

  • 檢查事務是否已刷新或調用 flush()提交後手動;
  • 檢查ID是否傳遞給 load()以及是否通過調試器傳遞了正確的ID
  • 啟用Hibernate打印生成的SQL和/或啟用日誌記錄

我嘗試了所有3個建議,但沒有一個幫助,雖然flush()使它更少發生(即它有時會工作!非常奇怪)。還有其他想法嗎? - 討厭的糊狀12年12月24日13:08

@nastypasty嗯,這至少可以說是奇怪的。我能想到的最好的方法是設置Hibernate日誌記錄配置並檢查TRACE級別日誌,這應該向您顯示問題並且它們對於小型INSERT應該是可讀的。你需要一個日誌後端才能使用它,我建議使用logback,但是slf4j支持很多其他的。如果你告訴我你選擇哪一個,我想如果你遇到任何問題我可以幫你設置... - TC1 12年1月24日15:33

7楼
0

我有一個與hibernate 3.6.10類似的問題,而我只是在搜索和選擇(如果存在)。

註釋:

  @Entity public class Familiares {@OneToMany(mappedBy =“familiares”)私人名單&lt; FamiliaresBaja&gt; BAJAS; @Entity @Table(name =“familiares_baja”)公共類FamiliaresBaja實現Serializable {private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id; @JoinColumn(name =“familiares_id”)@ManyToOne(optional = false)private Familiares familiares;   

然後我檢索一個List,並查看FamiliaresBaja,如果至少有一個。

  createQuery(“
     
			
        

這是一個解決方案,或者它看起來怎麼樣? - Trinimon '13年4月24日15:15

不,我只是強化了一個錯誤的想法,一個大的錯誤,一個非常簡單的例子 - FiruzzZ 2013年6月6日16:55

8楼
0

請檢查mysql服務器的lower_case_table_names的值。如果它的值為0,檢查hibernate生成的SQL,確保表名的大小寫與mysql中的實際表名一致。

9楼
0

我面對這個問題,這裡發生了什麼以及我如何解決它。你很可能也有同樣的事情發生。

我有POST和USER對象。他們處於OneToMany關係中(用戶可以有很多帖子)。使它成為雙向的,它們也處於ManyToOne關係中(一個帖子只屬於一個用戶)。

帖子類看起來

  @Entity @Table(name =“Post”) )public class Post {@Id @GeneratedValue(strategy = GenerationType.TABLE)private long postId; 私有字符串標題; 私有String體; @ManyToOne(fetch = FetchType.EAGER)@JoinColumn(name =“postUserId”)私有AutoUser autoUser; // getter和setter   

用戶類是

  @Entity @Table(name =“AUTO_USER” )public class AutoUser實現UserDetails {@Id @GeneratedValue(strategy = GenerationType.IDENTITY)private Long autoUserId; @Column(name =“USERNAME”)私有字符串用戶名; @OneToMany私人列表&lt; Post&gt; postList = new ArrayList&lt;&gt;(); // getter和setter   

第一個表名是Post和AUTO_USER我有3個用戶持久保存到AUTO_USER表(id為1,2,3)..並且3個帖子到帖子表1為每個用戶。(連接列或外鍵是1,2,3)

然後我只更改了用戶對象的表名,並將其命名為 @Table(name =“AUTO_USER2”)我在這個表中只有一個用戶名為1的用戶。

有沒有辦法配置tomcat,以便它提供沒有“java:comp / env /”的JNDI - m.weiloa 18年6月16日在0:37

10楼
0

檢查觸發器,如果您有一個插入前觸發器,並且序列中有NEXTVAL,則會導致該錯誤。

11楼
0

您正在尋找具有不同ID的實體中的一對一關係,嘗試在映射表中加載ID,而不是標識列。

48
votes
answers
18 views
+10

HQL Hibernate INNER JOIN

How can I write this SQL query in Hibernate? I would like to use Hibernate to create queries, not create the database.

SELECT * FROM Employee e INNER JOIN Team t ON e.Id_team=t.Id_team

I created entity classes in SQLServer2008,

@Entity
@Table(name="EMPLOYEE")
public class Employee
{
    @Id @GeneratedValue
    @Column(name="ID_EMPLOYEE")
    private int id_employee;
    @Column(name="SURNAME")
    private String surname;
    @Column(name="FIRSTNAME")
    private String firstname;
    @Column(name="ID_PROFESSION")
    private int id_profession;
    @Column(name="ID_BOSS")
    private int id_boss;
    @Column(name="HIRED_DATE")
    private Date hired;
    @Column(name="SALARY")
    private double salary;
    @Column(name="SALARY_ADD")
    private double salary_add;
    @Column(name="ID_TEAM")
    private int id_team;
    //setters and getters
}

@Entity
@Table(name="TEAM")
public class Team
{
    @Id @GeneratedValue
    @Column(name="ID_TEAM")
    private int id_team;
    @Column(name="TEAMNAME")
    private String teamname;
    @Column(name="ADDRESS")
    private String address;
    //setters and getters
}

I tried to build working select query in many ways but it still doesn't work.

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();                 
session.beginTransaction();
String select = "FROM Employee e INNER JOIN Team t ON e.Id_team=t.Id_team";
Query query = session.createQuery(select);
List elist = query.list();
session.getTransaction().commit();
session.close();    

Maybe something is wrong with entities?

up vote 39 down vote accepted favorite
沙发
+390
+50

只有在實體之間存在關聯時才能使用聯接。您的Employee實體不應該有一個名為 id_team 的字段,其類型為 int ,映射到一列。它應該與Team實體有一個ManyToOne關聯,映射為JoinColumn:

  @ManyToOne @JoinColumn(name =“ID_TEAM”)私人團隊團隊;   

然後,以下查詢將完美地運行:

 從Employee e inner join e.team   除了那些與任何團隊無關的員工之外,還將加載所有員工。 

對於作為實體映射的其他表的外鍵的所有其他字段也是如此,當然(<碼> id_boss <

是否可以創建與Employee id_employee和Employee id_boss的一對一關聯,必須在上面寫入時將其刪除?這是同一個表(例如:一個worker id_employee = 5有一個boss id_boss = 1(誰引用id_employee = 1),我應該創建:@OneToOne @JoinColumn(name =“ID_EMPLOYEE”)私人員工員工; //我想收到老闆的名字,但是這個方法不起作用employeeList.getEmployee()。​​getSurname(); - szefu 2013年8月22日14:45

一個老闆有很多員工,一個員工有一個老闆,所以應該是@ManyToOne @JoinColumn(名稱=“id_boss”)私人員工老闆 - JB Nizet 2013年8月22日15:15

當然你是對的 - szefu 2013年8月22日15:36

但是老闆沒有自己的老闆,所以值是db null,如何在hibernate中做呢? - szefu 2013年8月22日15:41

在這種情況下,boss字段將只是null。 - JB Nizet 2013年8月22日15:54

+50

您可以在不必創建真正的Hibernate映射的情況下完成此操作。試試這個:

  SELECT * FROM Employee e,Team t WHERE e.Id_team = t.Id_team  
     
			
        

如果我沒有弄錯,這會導致交叉連接,與內部連接相比,這將是非常性能密集的,因此在實際應用中使用它不值得冒險。 - Kenrig 2月12日14:38

downvote因為這是一個交叉連接,並且會產生一大堆記錄,因為它只是做兩個表的笛卡爾。 - 褲子2月18日1:03

+40
  import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.OneToMany; import javax.persistence.Table; @Entity @Table(name =“empTable”)公共類Employee實現Serializable {private static final long serialVersionUID = 1L; private int id; private String empName; 列表與LT;地址&gt; addList = new ArrayList&lt; Address&gt;(); @Id @GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name =“emp_id”)public int getId(){return id; public void setId(int id){this.id = id; public String getEmpName(){return empName; public void setEmpName(String empName){this.empName = empName; } @OneToMany(mappedBy =“employee”,cascade = CascadeType.ALL)public List&lt; Address&gt; getAddList(){return addList; public void setAddList(List&lt; Address&gt; addList){this.addList = addList; }   

我們有兩個實體Employee和Address with One to Many關係。

  import java.io.Serializable; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; @Entity @Table(name =“address” )public class Address實現Serializable {private static final long serialVersionUID = 1L; private int address_id; 私有字符串地址; 員工員工; @Id @GeneratedValue(strategy = GenerationType.IDENTITY)public int getAddress_id(){return address_id; public void setAddress_id(int address_id){this.address_id = address_id; public String getAddress(){return address; public void setAddress(String address){this.address = address; } @ManyToOne @JoinColumn(name =“emp_id”)public Employee getEmployee(){return employee; public void setEmployee(Employee employee){this.employee = employee; 通過這種方式我們可以實現兩個表之間的內連接 
  import java.util.List;}   

import org.hibernate.Query; 進口組織。hibernate.Session; public class Main {public static void main(String [] args){saveEmployee(); retrieveEmployee(); private static void saveEmployee(){Employee employee = new Employee(); 員工employee1 =新員工(); 員工employee2 =新員工(); 員工employee3 =新員工(); 地址address = new Address(); 地址address1 = new Address(); 地址address2 = new Address(); 地址address3 = new Address(); address.setAddress(“1485,Sector 42 b”); address1.setAddress(“1485,Sector 42 c”); address2.setAddress(“1485,Sector 42 d”); address3.setAddress(“1485,Sector 42a”); employee.setEmpName(“Varun的”); employee1.setEmpName(“克尚”); employee2.setEmpName(“Aasif”); employee3.setEmpName(“ 列表與LT;員工&GT; 列表= query.list(); 。list.stream()的forEach((P) - &GT; {的System.out.println(p.getEmpName());}); session.close(); } catch(Exception e){e.printStackTrace(); }

我使用Java 8 for循環來引用名稱。確保你有tomcat 8的jdk 1.8。還要添加一些記錄以便更好地理解。

  public class HibernateUtil {private static SessionFactory sessionFactory; static {Configuration configuration = new Configuration(); configuration.addAnnotatedClass(Employee.class); configuration.addAnnotatedClass(Address.class); configuration.setProperty(“connection.driver_class”,“com.mysql.jdbc.Driver”); configuration.setProperty(“冬眠。buildSessionFactory(builder.build()); public static SessionFactory getSessionFactory(){return sessionFactory; }}  
     
			
        
0
votes
answers
26 views
+10

是什麼@Transaction註釋Spring MVC中,什麼是它的主要目的

-4

什麼是Spring MVC中@Transaction註釋的,什麼是它的主要目的是什麼@Transaction註釋Spring MVC中,什麼是它的主要目的

enter link description here

+0

你有做過什麼研究嗎?閱讀任何文檔?請訪問[幫助]並閱讀[問]以瞭解如何使用本網站。 –

沙发
0
0

鯨,這裏的一些我爲你做的研究: https://www.javacodegeeks.com/2016/05/understanding-transactional-annotation-spring.html

而這個非常有幫助的線程在計算器上: Why we shouldn't make a Spring MVC controller @Transactional?

這些對我幫助很大。

0
votes
answers
29 views
+10

Java/Hibernate:非空屬性引用空值或瞬態值

0

爲了簡單起見,事件具有地址,許多事件可以共享相同的地址。所以我有一個ManyToOne關係。Java/Hibernate:非空屬性引用空值或瞬態值

活動類(我刪除了可讀性不相關的代碼)

@Entity 
@Table(name = "events") 
public class Event { 

    private Address address; 

    @ManyToOne(cascade = CascadeType.ALL) 
    @JoinColumn(name = "address_id", nullable = false) 
    public Address getAddress() { 
     return this.address; 
    } 
} 

地址類

@Entity 
@Table(name = "adresses") 
public class Address { 

    private Set<Event> events = new HashSet<Event>(0); 

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "address") 
    public Set<Event> getEvents() { 
     return this.events; 
    } 


} 

當我取ID爲6的事件,並嘗試將其刪除:

Event e = session.get(Event.class, 6); 
session.delete(e); 

我得到的錯誤not-null property references a null or transient value : logic.Event.address

但由於地址不初始化它既不瞬態因爲我從數據庫中檢索它,也沒有空:

Event e = session.get(Event.class, 6); 
System.out.println(e.getAddress().getAddressId()); //Output is 3, which is correct 

我不知道爲什麼發生這種情況,大多數人同樣的問題試圖保存一個暫時的對象,這根本不是我的情況。

+0

*沒有設置因爲我不需要它* !!但你需要它,所以映射是正確的。 –

+0

@chsdk真的嗎???????這是否導致「空」錯誤?笑 –

+0

是的,這應引起貼圖錯誤,我認爲thta就是爲什麼你得到了'非空屬性引用null或瞬時value'。 –

沙发
0
0

拆卸cascade註解我所有的@ManyToOne側實體解決我的問題。如果有人有解釋,請隨時評論!

0
votes
answers
30 views
+10

在postgresql中包含/ in文本數組的Hibernate條件

0

我有一個名爲box的實體。每個包含一些參數的參數對於許多唯一的ID都是相同的。唯一ID只是數字,並沒有任何其他角色。 所以我創建它們作爲postgresql和Java中的文本數組,我將它們作爲ArrayList並使用自定義用戶類型進行映射。 package com.geniedoc.utils;在postgresql中包含/ in文本數組的Hibernate條件

import java.io.Serializable; 
import java.sql.Array; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Types; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.Iterator; 
import java.util.List; 
import java.util.StringTokenizer; 
import org.hibernate.HibernateException; 
import org.hibernate.engine.spi.SessionImplementor; 
import org.hibernate.usertype.UserType; 

public class PostgresTextArrayType implements UserType { 

    protected static final int[] SQL_TYPES = {Types.ARRAY}; 
    public Class<String> returnedClass() { 
      return String.class; 
     } 

    public final int[] sqlTypes() { 
      return SQL_TYPES; 
     } 


     @Override 
     public Object nullSafeGet(ResultSet resultSet, String[] names, 
       SessionImplementor arg2, Object arg3) 
       throws HibernateException, SQLException { 
      List<String> list = null; 
      String nameVal = resultSet.getString(names[0]); 
      if (nameVal != null) { 
       nameVal = nameVal.substring(1,nameVal.length()-1); 
       list = new ArrayList<>(); 
       StringTokenizer tokenizer = new StringTokenizer(nameVal, ","); 
       while (tokenizer.hasMoreElements()) { 
        String val = (String) tokenizer.nextElement(); 
        list.add(val); 
       } 
      } 

      return list; 

     } 

     @Override 
     public void nullSafeSet(PreparedStatement statement, Object value, int index, 
       SessionImplementor arg3) throws HibernateException, 
       SQLException { 
      Connection connection = statement.getConnection(); 
       if (value == null) { 
        statement.setNull(index, SQL_TYPES[0]); 
       } else { 
        System.out.println("statement>>>>"+statement); 
        System.out.println("value>>>>"+ value); 
        System.out.println("index>>>>"+index); 
        @SuppressWarnings("unchecked") 
        ArrayList<String> parameter=new ArrayList<>(); 
        if(value instanceof Array) 
        { parameter=(ArrayList<String>) value; 
        }else 
        { 
         parameter.add((String) value); 
        } 
        ArrayList<String> list=parameter; 
        String[] castObject = Arrays.copyOf(list.toArray(), list.toArray().length, String[].class); 
        Array array = connection.createArrayOf("text", castObject); 
        statement.setArray(index, array); 
        System.out.println("statement>>>>"+statement); 
       } 
     } 
     @Override 
     public final Object deepCopy(final Object value) throws HibernateException { 
      return value; 
     } 

     @Override 
     public final boolean isMutable() { 
      return false; 
     } 

     @Override 
     public final Object assemble(final Serializable serializable, final Object arg1) 
       throws HibernateException { 
      return serializable; 
     } 

     @Override 
     public final Serializable disassemble(final Object o) throws HibernateException { 
      return (Serializable) o; 
     } 

     @Override 
     public final boolean equals(final Object x, final Object y) throws HibernateException { 
      if (x == y) { 
       return true; 
      } else if (x == null || y == null) { 
       return false; 
      } else { 
       return x.equals(y); 
      } 
     } 

     @Override 
     public final int hashCode(final Object x) throws HibernateException { 
      return x.hashCode(); 
     } 

     @Override 
     public final Object replace(
      final Object original, 
      final Object target, 
      final Object owner) throws HibernateException { 
      return original; 
     } 
      private String serialize(List<String> list) { 
       StringBuilder strbul = new StringBuilder(); 
       Iterator<String> iter = list.iterator(); 
       strbul.append("{"); 
       while (iter.hasNext()) { 
        strbul.append(iter.next()); 
        if (iter.hasNext()) { 
         strbul.append(","); 
        } 
       } 
       strbul.append("}"); 
       return strbul.toString(); 
      } 


} 

這是我的休眠條件: -

Session session=getSession(); 
    Criteria criteria=session.createCriteria(Box.class); 
    criteria.add(Restrictions.in("unique_id", unique_id)); 
    return (Unit)criteria.uniqueResult(); 

我需要包含一個特定的獨特id.But它不工作的框。 僅當我在數據庫中的文本數組中有一個值時才返回結果。 但是,如果我有在數據庫中的多個值,它不顯示任何結果。

任何幫助表示讚賞。

沙发
0
0

實施UserType通常是不值得的。由於Postgres接受數組的字符串格式,因此將類型@PrePersist,??和@PostLoad函數添加到您的類中會更好。由於它只是數字,所以轉換非常簡單。

@Transient 
private long[] theids; 

@Column(name = "the_ids") 
private String therealids; 

@PrePersist 
@PreUpdate 
private void encode() { 
    therealids = "{" + java.util.Arrays.toString(theids) + "}"; 
} 

@PostLoad 
private void decode() { 
    String[] ids = therealids.split(","); 
    theids = new long[ids.length]; 
    if (ids.length == 0) { 
     return; 
    } 
    int last = ids.length - 1; 
    // remove the "{" 
    ids[0] = ids[0].substr(1); 
    // remove the "}" 
    ids[last] = ids[last].substr(0, ids[last].length() - 1); 
    for (int i = 0; i < ids.length; i++) theids[i] = Long.parseLong(ids[i]); 
} 

至少有4個優化你可以做這個代碼,使其速度更快,更少的內存大戶,但這是短版。

如果您想要做同樣的事情,但是對於字符串數組,您必須非常瞭解該場景中陣列的正確轉義語法,更糟糕的是,可選的雙引號。

0
votes
answers
23 views
+10

如何在Hibernate框架中正確生成xml

1

我正在使用MS SQL數據庫服務器來處理數據,並且我有用於數據庫映射的Hibernate框架。我需要生成特定的數據(從... ...中選擇)到XML,但不知道如何。我試圖在網上搜索,但沒有...如何在Hibernate框架中正確生成xml

我有2個想法,但你可能會建議更有經驗的方法來解決這個問題。

  1. 在db層中使用FOR XML生成xml。 - >這裏我不知道在冬眠中選擇什麼結果...?串?不知道。
  2. 從數據庫檢索列表,然後用java該列表轉換成XML,例如使用該>??

你有什麼建議?謝謝

+0

您可能不需要xml定義,因爲Hibernate也可以映射到JPA。 – Alexcocia

沙发
0
0

有許多不同的參數可以作爲決定最佳方法的基礎(例如,數據庫無關是否很重要?是否提供任何xml模式作爲生成輸出的基礎?輸出是否會被使用/訪問?等)

如果您要生成的輸出類似於數據的普通轉儲,並且將來會用於將數據導入數據庫(或類似的用法),那麼也許只是在數據庫層中生成輸出就足夠了。但大多數時候情況並非如此。我強烈建議在應用程序層中生成輸出,以便您可以更好地控制將來生成和定製的方式。您可以使用普通的hibernate查詢獲取數據並使用(如您所述)JAX-B將其序列化爲XML。

板凳
0
0

我不會在數據庫級別生成XML。由於您已經在使用Hibernate,因此您可以將實體對象轉換爲數據傳輸對象(DTO),該對象基本上是同一個對象,但這次打算由庫進行編組和解組。而不是JAXB,你可能想看看傑克遜,這有點複雜(Google for xml jackson),如果有人決定輸出應該用JSON或YAML來代替,那麼它很容易改變。

42
votes
answers
32 views
+10

Design patterns that every developer must know?

What are the design patterns that every developer must know?

I'm interested in the context of Java web developers working with Spring & Hibernate. I have often heard that good knowledge in design patterns is essential for working with those frameworks. Can anyone list the specifics?

For example, I know that understanding abstract factory & factory pattern, singleton pattern etc is absolutely essential. I'm looking for a comprehensive list.

沙发
+190
工廠在Java框架中無處不在,了解為何以及何時使用工廠模式至關重要。

Singleton(模式和反模式)

學習如何負責任地使用單例模式非常有助於理解您可能正在閱讀的其他人的代碼中的陷阱。 / p>

總體而言,學習為什麼關於模式更重要的是如何知道什麼時候不應用模式與知道什麼時候一樣重要。 總的來說,學習為什麼關於模式更重要的是如何知道什麼時候不應用模式與知道什麼時候一樣重要。 總的來說,學習為什麼關於模式更重要的是如何知道什麼時候不應用模式與知道什麼時候一樣重要。

板凳
+50

每個人都應該知道關於 Singleton,還有時才能使用它!對於我在工作中的項目來說,這是我目前的痛苦之源。

單身人士使代碼難以理解和遵循,並使編寫單元測試變得更加困難。我喜歡 Singletons is Pathological Liars 的博客文章。

+1“單身人士是病態的說謊者” - 米奇小麥2009年8月8日2:46

格雷格 - 你覺得很多人在這裡沒有諷刺意味嗎? - 馬丁貝克特於2009年8月8日18:44

地板
+40

大多數設計模式非常明顯 - 如果你已經編程了幾年,你就已經知道並使用它們。

我發現設計模式的最大優勢是共享一套名。如果有人說“回調”可能意味著很多事情,但是如果有人說“聽眾模式”意味著更具體的一組調用並暗示了對象之間更高層次的關係。

所以從本質上講,閱讀一本好的設計模式書,了解每個模式的名稱,花一些時間了解你不知道的任何事情,並且你很高興去。

我不會完全忽視他們中的任何一個 - 他們都很高興見過。

4楼
+40

模型 - 視圖 - 控制器只需要在列表中,Spring有一個MVC框架:

http://en.wikipedia.org/wiki/Model-view-controller

實際上Spring有一個MVC模塊(Spring MVC),但除此之外還有許多其他的東西 - matt b 2009年8月8日2:55

@matt b - 我的錯誤,我想我只是假設所以SO上的很多問題都提到'Spring MVC' - karim79 09年8月8日2:56

+1我最喜歡的設計模式。 - 2009年8月8日7:20的第一首

5楼
+30

我建議您閱讀 Head First Design Patterns 一書。這是一本關於所有公共和有用模式的書。

6楼
+20

我建議您閱讀並閱讀“設計模式”一書,因為它為您提供了詞彙量。

7楼
+20

但不要忘記基礎知識:)

在我眼中採訪眼淚的Java開發人員訪談 http://java.sys-con.com/node/1040135

絕對!我做的其中一件事是通過Head First,然後是Core Java - 第1捲和第2卷,第一個servlet,有效的Java ..我還沒有完成那些書,我需要經常閱讀/推薦,特別是。有效的java。我粗略地看一下Spring,並理解了基本概念,但在我看來,在我能夠理解之前,我需要在設計模式上學到很多東西。當我遇到問題時,我仍然會繼續回歸基本面。Jon Skeet在這裡有一篇有趣的帖子:yoda.arachsys.com/java/learning.html - Shaw Aug 9 '09 at 1:17

8楼
+10

休眠?那麼工作單位是必須的 http://martinfowler.com/eaaCatalog/unitOfWork.html

Composite,它出現在JUnit框架中。(Test-TestCase-TestSuite)

適配器,構建器,命令,模板方法和策略模式很容易並且通常可以在實踐中使用。

狀態模式也幫助我清理亂用繼承的源代碼。

另見stackoverflow.com/questions/734614/ - Vadzim 2013年10月16日5:20

9楼
+10

這將是格雷格Hewgill的引用註釋,以“單身人士病態說謊者”,但我不能做評論。

這文章讓令人信服的理由,但他的憤怒是誤導。正如他博客上的幾位評論者所說,他的問題實際上是全球性的。他的代碼修復仍然可以使用單例,並且仍然可以獲得清晰度和可測試性的確切增加。

重新閱讀文章。他並不擔心Of??flineQueue需要初始化的數據庫實例,也不需要CreditCardProcessor需要初始化的OfflineQueue。他很擔心這些依賴關係是不可見的,這會導致可維護性和可測試性問題。

他的問題在於秘密的全局狀態( 這確實讓我聽起來像一個陰謀論?的)。

然而,他(IMO)可能會誤以為秘密全局狀態為單身人士的錯。

那並不這意味著我贊成單身人士,他們沒有必要 - 當然,他們有缺點(包括明顯的線程爭用瓶頸可能性)。但我更願意清楚我正在避免的做法。

順便提一下,我會進一步進行重構 - 基於類名,我會在代碼審查中斷言,CreditCardProcessor應該處理收費,所以代替他:

  card.charge(cardProcessor,100);   

我有這個,而是:

  cardProcessor。chargeCard(card,100);   

(是的,我用他認為更易讀的名字替換了他的變量名 c ccp

可能它們是從沒有定義TransactionManager的上下文中運行的? - rjsang 2010年7月20日14:38

它可以在沒有註釋的情況下工作,因為默認情況下,除非使用元素,否則應該在配置中定義事務劃分(請參閱static.springsource.org/spring/docs/2.0.x/reference /) - jjmontes 2011年6月2日10:21

10楼
+10

除了抽象工廠 Factory Method Singleton 模式,你已經引用過,我認為下面的模式很有用。

橋接模式:抽象和實現可以獨立更改

裝飾器模式:在運行時更改對象的行為

介體模式:在不同對象之間啟用中央通信介質

責任鏈:如果要向Web服務請求添加過濾器,這是很有用。

策略模式

只是警告那些嘗試這個並使用Spring的人:我在配置'current_session_context_class'時遇到了不同的錯誤。在其他幾個問題中,這讓位於交易問題。實際上,這似乎消除了春季交易管理。(參見例如:stackoverflow.com/questions/4293098/) - Yashima 12年7月17日15:31

我也有不同的行為。我從數據庫中加載了一個對象,進行了更改,然後嘗試保留它。為了使它工作,我不得不從會話中逐出它然後保存。 - Zoidberg 2013年10月4日16:00

11楼
-10

Singleton - Singletons顯然可以而且應該用於所有事情

用於一切? - 你開玩笑吧? - 米奇小麥09年8月8日凌晨2點47分

如果只有我;-) - 馬丁貝克特2009年8月8日2:48

是的,某些人失去了諷刺意味。 - 格雷格·休吉爾於2009年8月8日21:54

@jgauffin _我認為在海洋的某個地方有一個講英語但不懂諷刺的大國。 - 馬丁貝克特2010年12月2日17:35

:-)搞笑,但我認為它不值得回答,它也不應該被投票。 - webDeveloper 2015年3月2日16:00

97
votes
answers
47 views
+10

Invalid syntax error “type= MyISAM” in DDL generated by Hibernate

I am getting this error for my Java code

   Caused by :`com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException`: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB` server version for the right syntax to use near 'type = `MyISAM`' at line 1

This is the query passed by hibernate:

Hibernate: create table EMPLOYEE (emp_id integer not null, FNAME varchar(255), LNAME varchar(255), primary key (emp_id)) type=MyISAM

I have looked at all questions related to this error. But in all that questions the user itself is passing query "type = MyISAM" so they can change "type" to "engine", but here hibernate is responsible for creating table, so I don't understand where the mistake is, and how I can fix it.

This is my configuration file:

<hibernate-configuration>
 <session-factory >
 <property name="hibernate.hbm2ddl.auto">create</property>
  <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  <property name="hibernate.connection.url">jdbc:mysql://localhost/servletcheck</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.connection.password"> </property>
  <property name="hibernate.dialect"> org.hibernate.dialect.MySQLDialect</property>
  <property name="hibernate.show_sql">true</property>
  <mapping resource="Employee.hbm.xml"/>
 </session-factory>
</hibernate-configuration>

This is my mapping file:

<hibernate-mapping>
    <class name="first.Employee" table="EMPLOYEE">
        <id name="id" type="int">
            <column name="emp_id" />
            <generator class="assigned" />
        </id>
        <property name="fname" type="java.lang.String">
            <column name="FNAME" />
        </property>
        <property name="lname" type="java.lang.String">
            <column name="LNAME" />
        </property>
    </class>
</hibernate-mapping>

This is my class file:

public class StoreData {
    public static void main(String[] args) {
        Configuration cfg=new Configuration();
        cfg.configure("hibernate.cfg.xml");
        SessionFactory factory=cfg.buildSessionFactory();
        Session session=factory.openSession();
        org.hibernate.Transaction t=session.beginTransaction();
        Employee e=new Employee();
        e.setId(1);
        e.setFname("yogesh");
        e.setLname("Meghnani");
        session.persist(e);
        t.commit();

    }
}
up vote 85 down vote accepted favorite
沙发
+850
+50

問題是方言 org.hibernate.dialect.MySQLDialect 適用於MySQL 4.x或更早版本。由此方言生成的片段 TYPE = MYISAM 在MySQL 4.0中已棄用,在5.5中已刪除。

鑑於您使用MariaDB,您需要使用(取決於MariaDB的版本和 - 可能 - Hibernate的版本)之一:

  • org .hibernate.dialect.MariaDBDialect
  • org.hibernate.dialect.MariaDB53Dialect

    如果您使用的是MySQL,或者您的Hibernate版本中不存在MariaDB的上述兩種方言:

    • org.hibernate.dialect.MySQL5Dialect
    • <
+120

它是與Dialect相關的問題,而不是 org.hibernate.dialect.MySQLDialect ,您可以使用 org.hibernate.dialect.MySQL5Dialect 它會愉快地工作。

0

當我使用MySql數據庫時,方言更改對我不起作用。最簡單的方法是下載並使用標準版本的Sql連接器。工作得非常好。

http://www.java2s的.com /代碼/罐/米/ Downloadmysqlconnectorjar.htm