2016-12-28 75 views
0

我有我的EclipseLink的一對一的關係出了問題,關係是用戶和代理之間,且誤差JPA字段沒有默認值,以一對一的關係

異常[EclipseLink-4002](Eclipse持久性服務 - 2.5.0.v20130507-3faac2b):org.eclipse.persistence.exceptions.DatabaseException內部 異常:java.sql.SQLException:字段'userId'沒有 默認值錯誤代碼:1364調用:INSERT INTO AGENT(ADDRESS,NOM, PRENOM)VALUE(?,?,?)bind => [3個參數綁定]

class diagram

database implementation

,這是我的JPA代碼

@Entity 
@NamedQuery(name="User.findAll", query="SELECT u FROM User u") 
public class User implements Serializable { 
private static final long serialVersionUID = 1L; 
    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id; 
    private int active; 
    private String email; 
    private String password; 
    //bi-directional one-to-one association to Agent 
    @OneToOne(mappedBy="user",cascade=CascadeType.PERSIST) 
    private Agent agent; 
    //.... 


@Entity 
@NamedQuery(name="Agent.findAll", query="SELECT a FROM Agent a") 
public class Agent implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id; 

    private String address; 

    private String nom; 

    private String prenom; 

    //bi-directional one-to-one association to User 
    @OneToOne(cascade=CascadeType.PERSIST) 
    @PrimaryKeyJoinColumn(name="userId") 
    private User user; 
//... 
} 

//the code that contains the error 
     Agent agent = new Agent(); 
     agent.setAddress("addresse 1"); 
     agent.setNom("nom1"); 
     agent.setPrenom("prenom 1"); 
     User user = new User(); 
     user.setActive(1); 
     user.setEmail("[email protected]"); 
     user.setPassword("[email protected]"); 
     agent.setUser(user); 
     agentService.add(agent); 
+0

你沒有使用Hibernate。您正在使用EclipseLink。 –

+0

但導入全部是導入javax.persistence。*; –

+0

是的,這是標準的JPA軟件包。 Hibernate和EclipseLink是JPA規範的兩種不同實現。 –

回答

0

當我用PrimaryKeyJoinColumn我已經熟悉了這種問題的EclipseLink。

Agent實體,可以定義id爲PK:

@Id 
@GeneratedValue(strategy=GenerationType.IDENTITY) 
private int id; 

但你也定義了承載PK另一場(userId這也是對用戶表的外鍵):

//bi-directional one-to-one association to User 
@OneToOne(cascade=CascadeType.PERSIST) 
@PrimaryKeyJoinColumn(name="userId") 
private User user; 


我不確定這是你的目標,當我看到你的數據庫圖。

如果我看不到正確的,並且您確實想要這樣做,您可以嘗試使用一些東西作爲Embeddable對象來承擔PK的必填字段。
如果您總是有例外情況,您可以通過先保持用戶身份,然後將其設置爲代理並堅持代理,繞過該問題。

如果您不需要這個組合鍵在Agent,更換@PrimaryKeyJoinColumn通過@JoinColumn

取而代之的是:

//bi-directional one-to-one association to User 
@OneToOne(cascade=CascadeType.PERSIST) 
@PrimaryKeyJoinColumn(name="userId") 
private User user; 

這樣做:

//bi-directional one-to-one association to User 
@OneToOne(cascade=CascadeType.PERSIST) 
@JoinColumn(name="userId") 
private User user; 
+0

我已將@PrimaryKeyJoinColumn(name =「userId」)替換爲 @JoinColumn(name =「userId」),現在錯誤爲字段userId存在多個可寫映射,並且不再部署 –

+0

在您的實際Agent的映射,userId映射一次。如果您有其他映射,則應編輯您的帖子並顯示所有相關信息。 – davidxxx

0

通過具有您的「ID」字段爲「IDENTITY」策略,在此數據存儲區中,此列必須爲類似AUTO_INCREMENT(MySQL)或SERIALIDENTITY。這就是IDENTITY策略的一個先決條件(如果您讓JPA提供程序生成模式將會默認獲得)。

如果不是則改變列類型是這樣的,變化的策略,是東西,生成(未在數據存儲區)在運行時的值。

相關問題