gpt4 book ai didi

java - JPA持久化继承

转载 作者:太空宇宙 更新时间:2023-11-04 12:08:45 24 4
gpt4 key购买 nike

我有一个长期面临的问题,但没有得到答案。

我想使用 JPA 保留继承表,但收到错误消息。我为此使用 eclipselink 。

我的单元测试因该类而失败。

    -- Table: PERSON

CREATE TABLE PERSON (
ID SERIAL NOT NULL PRIMARY KEY
DEFAULT nextval ('Person_Sequence'),
FIRST_NAME VARCHAR NOT NULL,
LAST_NAME VARCHAR NOT NULL,
DTYPE VARCHAR
);

-- Table: BUYER

CREATE TABLE BUYER (
ID INTEGER NOT NULL PRIMARY KEY
);

我有一个类(class)和餐 table 人员以及该类(class)人员的子类(class)买家

人员类别:

   import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;

@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Person {

@Id
private int ID;
@Column(name="FIRST_NAME")
private String firstName;
@Column(name="LAST_NAME")
private String lastName;

protected Person() {
}

public Person(int ID, String firstName, String lastName) {
this.ID = ID;
this.firstName = firstName;
this.lastName = lastName;
}

public int getId() {
return ID;
}

public void setId(int id) {
this.ID = id;
}

public String getFirstName() {
return firstName;
}

public void setFirstName(String firstName) {
this.firstName = firstName;
}

public String getLastName() {
return lastName;
}

public void setLastName(String lastName) {
this.lastName = lastName;
}

@Override
public String toString() {
return "Person [getId()=" + getId() + ", getFirstName()=" + getFirstName() + ", getLastName()=" + getLastName()
+ "]";
}

}

买家类别:

import java.util.ArrayList;
import java.util.Collection;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.OneToMany;

@Entity
public class Buyer extends Person {

protected Buyer() {
};

public Buyer(int id, String firstName, String lastName) {
super(id, firstName, lastName);
}

}

到目前为止还没有出现错误。但在这里您可以看到我的单元测试和我收到的错误消息:

import static org.junit.Assert.*;


import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

public class BuyerTest {

final private int id = 33;
final private String firstName = "Bart";
final private String lastName = "Simpson";

static EntityManagerFactory factory;
static EntityManager manager;
static EntityTransaction transaction;

@BeforeClass
public static void setup() {
factory = Persistence.createEntityManagerFactory("testEclipseLink");
assertNotNull(factory);
manager = factory.createEntityManager();
assertNotNull(manager);
transaction = manager.getTransaction();
}

@AfterClass
public static void teardown() {
if (manager == null)
return;
manager.close();
factory.close();
}

@Test
public void create() {
transaction.begin();
System.out.println("first " + firstName + "last " + lastName);
Buyer buyer = new Buyer(id, firstName, lastName);
assertNotNull(buyer);
manager.persist(buyer);
transaction.commit();
}

@Test
public void modify() {
Buyer buyer = manager.find(Buyer.class, id);
assertNotNull(buyer);
transaction.begin();
buyer.setFirstName("Homer");
transaction.commit();
teardown();
setup();
buyer = manager.find(Buyer.class, id);
assertEquals("Homer", buyer.getFirstName());
}

@Test
public void remove() {
Buyer buyer = manager.find(Buyer.class, id);
assertNotNull(buyer);
transaction.begin();
manager.remove(buyer);
transaction.commit();
buyer = manager.find(Buyer.class, id);
assertNull(buyer);
}




}

所以,如果我运行测试,我会收到此错误:

[EL Warning]: 2016-10-16 19:53:54.691--UnitOfWork(2036292945)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.6.4.v20160829-44060b6): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: org.postgresql.util.PSQLException: FEHLER: NULL-Wert in Spalte »first_name« verletzt Not-Null-Constraint
Detail: Fehlgeschlagene Zeile enthält (33, null, null).
Error Code: 0
Call: INSERT INTO BUYER (ID) VALUES (?)
bind => [1 parameter bound]

它告诉我,我在 Firstname 上遇到了空约束错误。但是如果我在控制台上打印名字,它就被设置了。

我已经尝试过,如果我删除继承并仅使用我的 Buyer 类,它就可以正常工作!所以我无法弄清楚买家和人员类别之间的问题出在哪里。另外如果是 Src- 或 Table 定义问题

最佳答案

我看到的第一件事是买家是一个人,因此您需要在架构中添加外键来反射(reflect)这一点。

CREATE TABLE BUYER (
ID INTEGER NOT NULL PRIMARY KEY,
personId bigint unsigned NOT NULL,
constraint fk_personId foreign key (personId) references PERSON (id)

);

此外,在您的子类中,您还需要注释。

@PrimaryKeyJoinColumn(name="personId")

一个好主意是让表的所有 ID 自动递增

关于java - JPA持久化继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40073574/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com