2016-12-11 29 views
1

美好的一天。我嘗試使用持久性api來實現多對多的依賴關係。 我填補新的用戶數據,並嘗試將其添加到數據庫中,但得到的異常:Java持久性api:類在關係屬性中使用非實體類作爲目標實體

Exception Description: [class main.java.entities.User] uses a non-entity [class main.java.entities.UserAccounts] as target entity in the relationship attribute [field accounts].

我嘗試使用@ManyToMany註釋差值在name部分如bank_user_accountsuserAccounts。第二個值是persistence.xml中的單位名稱。但是這個麻煩依然存在。

用戶類:

@Entity(name="bank_users") 
public class User { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 

    @ManyToMany 
    @JoinTable(
     name = "bank_user_accounts", 
     joinColumns = @JoinColumn(name = "user_id"), 
     inverseJoinColumns = @JoinColumn(name = "account_id") 
) 
    private List<UserAccounts> accounts; 
} 

UserAccounts類:

@Entity(name="bank_user_accounts") 
public class UserAccounts { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 

    @Column(name = "user_id") 
    private int userId; 

    @Column(name = "account_id") 
    private int accountId; 
} 

的persistence.xml:

<?xml version="1.0" encoding="UTF-8" ?> 
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
      version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"> 
    <persistence-unit name="users" transaction-type="RESOURCE_LOCAL"> 
    <class>main.java.entities.User</class> 
    <properties> 
     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
     <property name="javax.persistence.jdbc.url" value="deleted" /> 
     <property name="javax.persistence.jdbc.user" value="deleted" /> 
     <property name="javax.persistence.jdbc.password" value="deleted" /> 
    </properties> 
    </persistence-unit> 

    <persistence-unit name="userAccounts" transaction-type="RESOURCE_LOCAL"> 
    <class>main.java.entities.UserAccounts</class> 
    <properties> 
     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
     <property name="javax.persistence.jdbc.url" value="deleted" /> 
     <property name="javax.persistence.jdbc.user" value="deleted" /> 
     <property name="javax.persistence.jdbc.password" value="deleted" /> 
    </properties> 
    </persistence-unit> 

</persistence> 
+0

所以,我用這個爲例,現在所有的偉大工程https://www.mkyong.com/hibernate/hibernate-many-to-many-relationship-示例註釋/ – Evgeniy175

回答

0

UserUserAccounts聲音而@OneToMany或僅僅一個可嵌入的類之間的關係。

@ManyToMany應在雙方都有註釋(雙向),並且應在一側設置mappedBy屬性,以指向引用此實體作爲集合的另一方的屬性名稱。

0

我在你的代碼中觀察到的一件事是你在User類中使用了manytomany註釋,但是你沒有在userAccounts類中使用。爲了實現ManyToMany關係,兩個實體都應該用ManyToMany標註。

+0

這也是一個錯誤,應該有列表,以及UserAccounts - 鏈接用戶和帳戶的類,提供多對多的參考 – Evgeniy175

+0

我稱之爲抄襲... – Mordechai

0

問題是(儘管可能已過時)您有一個持久單元的引用。你可以很容易地把兩個相同的單位:

<?xml version="1.0" encoding="UTF-8" ?> 
<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
      version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"> 
    <persistence-unit name="users" transaction-type="RESOURCE_LOCAL"> 
    <class>main.java.entities.User</class> 
    <class>main.java.entities.UserAccounts</class> 
    <properties> 
     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 
     <property name="javax.persistence.jdbc.url" value="deleted" /> 
     <property name="javax.persistence.jdbc.user" value="deleted" /> 
     <property name="javax.persistence.jdbc.password" value="deleted" /> 
    </properties> 
    </persistence-unit> 
</persistence> 
相關問題