java - 违反完整性约束

标签 java hibernate jpa playframework

使用游戏!框架,我有以下两个模型:

@Entity
public class User extends Model {
    public String firstName;
    public String lastName;
    public String email;
    public String password;
    public boolean isAdmin;

    @OneToMany(mappedBy="id", cascade=CascadeType.ALL)
    public List<Site> sites;

    public User(String firstName, String lastName, String email, String password) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
        this.password = password;
    }

    public static User connect(String email, String password) {
        return User.find("byEmailAndPassword",email,Crypto.passwordHash(password)).first();
    }

    public static User findUser(String email) {
        return User.find("byEmail",email).first();
    }

    public static User createUser(String firstName, String lastName, String email, String password, boolean isAdmin) {
        String pw = Crypto.passwordHash(password);

        User u = new User(firstName, lastName, email, pw);
        u.isAdmin = isAdmin;
        u.save();
        return u;
    }
}

@Entity
public class Site extends Model {

    public UUID siteId;

    public String alias;
    public String protocol;
    public String host;
    public String username;
    public String password;
    public int port;
    public String rootPath;

    @Lob
    public String description;

    @ManyToOne
    public User user;

    public Site(User user, String alias, String protocol, String host, String username, String password) {
        this.user = user;
        this.alias = alias;
        this.protocol = protocol;
        this.host = host;
        this.username = username;
        this.password = password;
        this.port = 21;
        this.siteId = UUID.randomUUID();

    }
}

当我尝试运行以下测试时:

public class BasicTest extends UnitTest {

    @Before
    public void setup() {
        Fixtures.deleteAll();
    }

    @Test
    public void createAndRetrieveUser() {
        new User("Jason","Miesionczek","something","something").save();
        User jason = User.find("byEmail", "something").first();

        assertNotNull(jason);
        assertEquals("Jason", jason.firstName);
    }

    @Test
    public void userSite() {
        new User("Jason","Miesionczek","something","something").save();
        User jason = User.find("byEmail", "something").first();

        new Site(jason, "InterEditor","ftp","something","something","something").save();

        List<Site> sites = Site.find("byUser", jason).fetch();

        assertEquals(1, sites.size());

        Site site1 = sites.get(0);
        assertNotNull(site1);
        assertEquals("InterEditor", site1.alias);
        assertNotNull(site1.siteId);
    }



}

我得到这个错误:

A javax.persistence.PersistenceException has been caught, org.hibernate.exception.ConstraintViolationException: could not insert: [models.Site]
In /test/BasicTest.java, line 27 :
new Site(jason, "InterEditor","ftp","something","something","something").save();

日志输出:

00:06:26,184 WARN  ~ SQL Error: -177, SQLState: 23000
00:06:26,184 ERROR ~ Integrity constraint violation - no parent FK2753674FD92E0A
 table: USER in statement [insert into Site (id, alias, description, host, passw
ord, port, protocol, rootPath, siteId, user_id, username) values (null, ?, ?, ?,
 ?, ?, ?, ?, ?, ?, ?)]

任何人都可以帮助我理解错误的含义以及我做错了什么吗?

最佳答案

这里您的问题是 Site 模型类和 User 模型类之间的映射。给出的错误是缺少外键。

如果您在 User 类中注释掉 Site 列表,您的测试就会通过。这样就缩小了问题的范围。

更新:

问题是因为当您的 Site 对象被保存时,它会先保存子对象(包括 User 对象)。发生这种情况时,它会尝试创建对 Site 对象的引用(由于 mappedBy 参数),但这尚未保存(这将在保存 User 对象后完成)。

因此,另一种方法是通过您有权访问的值(例如站点 ID)进行映射,或者在用户保存后将其添加到站点(因此已生成 ID 值)。

我将您的代码更改为 mappedBy="siteId" 并且测试运行正常。

关于java - 违反完整性约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4420516/

相关文章:

java - Mockito NumberFormat 在 when() 方法中模拟 NullPointer

java - JPA 和 Hibernate 初始化非惰性集合错误

java - Hibernate 和 Spring MVC。交易不工作

java - 如何处理网络中断和连接池

java - 带有 Spring 数据的 JPA

java - 解析时间戳 Soap 转换为 Java Date

java - 在 JavaFX 中更改场景而不调整窗口大小

java - libgdx 列表小部件的两个问题

java - 是什么减慢了 Hibernate/Oracle 的速度?

java - EJB 3 的问题