Java 子实体在JPA中半持久化的可能场景是什么?
我在使用EclipseLink和Spring@Transascional注释 课程如下:Java 子实体在JPA中半持久化的可能场景是什么?,java,spring,jpa,eclipselink,Java,Spring,Jpa,Eclipselink,我在使用EclipseLink和Spring@Transascional注释 课程如下: @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "type") public abstract class Base{ Long x; Long y; } @Entity @DiscriminatorValue("child") public class C
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
public abstract class Base{
Long x;
Long y;
}
@Entity
@DiscriminatorValue("child")
public class Child extends Base{
Long z;
Long w;
}
@Transactional
public void doSomething(){
if(somethingWrong){
throw new MyCheckedException();
}
entityManager.persist(new Child(1, 2, 3, 4));
}
id | type | x | y | z | w |
-----------------------------------
7 | child | 1 | 2 | NULL | NULL |
方法如下:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
public abstract class Base{
Long x;
Long y;
}
@Entity
@DiscriminatorValue("child")
public class Child extends Base{
Long z;
Long w;
}
@Transactional
public void doSomething(){
if(somethingWrong){
throw new MyCheckedException();
}
entityManager.persist(new Child(1, 2, 3, 4));
}
id | type | x | y | z | w |
-----------------------------------
7 | child | 1 | 2 | NULL | NULL |
一旦我在DB中发现以下内容:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type")
public abstract class Base{
Long x;
Long y;
}
@Entity
@DiscriminatorValue("child")
public class Child extends Base{
Long z;
Long w;
}
@Transactional
public void doSomething(){
if(somethingWrong){
throw new MyCheckedException();
}
entityManager.persist(new Child(1, 2, 3, 4));
}
id | type | x | y | z | w |
-----------------------------------
7 | child | 1 | 2 | NULL | NULL |
我无法重现这种行为。这怎么可能
关于z
和w
的一些附加信息:
z
是一些刚从DB实体中提取的id值w
是不允许为空的其他值。此外,如果调用persist
之前w
或z
中的一个将为null
,则会抛出NullPointerException
。
提前感谢。您确定DB中的这一行是用相同的代码生成的吗?它可以是手动插入的一行,甚至是以前版本代码中的一行……你好,Gaël!所以情况是不可能的-代码是新的,没有人可以手动插入这一行打开日志记录到finest,并且您可能希望临时更改两列中的一列,使其具有NOTNULL约束,以便在问题insert上引发异常,以准确显示这是从代码中的何处引起的。请注意,您提供的代码不完整-Child没有按照您的预期扩展基类。我确信这是一个剪切粘贴错误,但实际代码中容易忽略的东西可能导致或与此相关。嗨@Chris,谢谢回复!打开日志记录并设置NOTNULL约束也是一个好主意,这个步骤将帮助我识别到底发生了什么。但现在我甚至不能复制这种行为,需要帮助找到这种行为的可能来源。完整代码令人困惑,很抱歉输入错误。但
z
是刚刚从DB实体中提取的id
-值w
是不允许为空的其他值。此外,如果调用persist
之前w
或z
中的一个将null
,则会抛出NullPointerException
。您确定DB中的此行是用相同的代码生成的吗?它可以是手动插入的一行,甚至是以前版本代码中的一行……你好,Gaël!所以情况是不可能的-代码是新的,没有人可以手动插入这一行打开日志记录到finest,并且您可能希望临时更改两列中的一列,使其具有NOTNULL约束,以便在问题insert上引发异常,以准确显示这是从代码中的何处引起的。请注意,您提供的代码不完整-Child没有按照您的预期扩展基类。我确信这是一个剪切粘贴错误,但实际代码中容易忽略的东西可能导致或与此相关。嗨@Chris,谢谢回复!打开日志记录并设置NOTNULL约束也是一个好主意,这个步骤将帮助我识别到底发生了什么。但现在我甚至不能复制这种行为,需要帮助找到这种行为的可能来源。完整代码令人困惑,很抱歉输入错误。但z
是刚刚从DB实体中提取的id
-值w
是不允许为空的其他值。此外,如果在调用persist
之前w
或z
中的一个将null
,则会抛出NullPointerException
。