2016-12-28 137 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提供程序生成模式将会默认获得)。

如果不是则改变列类型是这样的,变化的策略,是东西,生成(未在数据存储区)在运行时的值。