JPA 字段没有默认值,一对一关系



我在eclipselink中的一对一关系有问题,该关系是在用户和代理之间的,并且错误是

异常[Eclipselink -4002](Eclipse持久服务 - 2.5.0.V20130507-3FAAC2B):org.eclipse.persistence.exceptions.databaseexception内部 异常:java.sql.sqlexception:field'userId'没有 默认值错误代码:1364调用:插入到代理(地址,NOM, prenom)value(?,?,?)bind => [3个参数绑定]

类图

数据库实现

这是我的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("test@mail.local");
        user.setPassword("p@ssword");
        agent.setUser(user);
        agentService.add(agent);

通过将您的" id"字段作为" IDENTITY"策略,在数据存储中,本列必须像 AUTO_INCREMENT(mySQL)或 SERIALIDENTITY。这就是IDENTITY策略作为先决条件(如果您让JPA提供商生成架构的话,默认情况下将会有)。

如果不是这样,则将列类型更改为这样,将策略更改为在运行时生成值的东西(不在datastore)。

当我使用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;

最新更新