为什么JPA2.2将java.util.Date存储为null
我有一个JavaEE实体类,其中包含一个为什么JPA2.2将java.util.Date存储为null,java,ejb,jpa-2.2,Java,Ejb,Jpa 2.2,我有一个JavaEE实体类,其中包含一个Java.util.Date字段。由于某种原因,未存储此字段的值 @Entity @Table(name = "PERSISTENCE_USER") @NamedQueries({ @NamedQuery(name = "findAllusers", query = "SELECT U FROM User u " + "ORDER BY u.userId&
Java.util.Date
字段。由于某种原因,未存储此字段的值
@Entity
@Table(name = "PERSISTENCE_USER")
@NamedQueries({
@NamedQuery(name = "findAllusers",
query = "SELECT U FROM User u "
+ "ORDER BY u.userId"
),
@NamedQuery(name = "getAUser",
query = "SELECT U FROM User u "
+ "WHERE u.userId =?1 AND u.password=?2 "
+ "ORDER BY u.userId"
)
})
public class User implements Serializable {
private static final long serialVersionUID = 10044331905L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@NotNull
private String firstName;
@NotNull
private String lastName;
@Temporal(TemporalType.TIMESTAMP)
private Date dateOfBirth;
............
}
以下是填充表中一行的单例:
@Singleton
@Startup
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
public class DataLoaderSessionBean {
@EJB
private LoginRequestSessionBean requestLogin;
@PostConstruct
public void createData() {
try {
List<User> users = new ArrayList();
Date date = new Date(System.currentTimeMillis());
users.add(new User("Joe","Ottaviano",date));
users.add(new User("Partrick","Tucker",date));
requestLogin.addUsers(users);
} catch (Exception e) {
}
}
@Singleton
@启动
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER)
公共类DataLoaderSessionBean{
@EJB
私有LoginRequestSessionBean请求登录;
@施工后
public void createData(){
试一试{
列表用户=新建ArrayList();
日期日期=新日期(System.currentTimeMillis());
添加(新用户(“Joe”,“Ottaviano”,日期));
添加(新用户(“Partrick”,“Tucker”,date));
requestLogin.addUsers(用户);
}捕获(例外e){
}
}
稍后检索和检查数据时,日期字段为空:
@Stateful
public class LoginRequestSessionBean {
@PersistenceContext
EntityManager em;
public void addUsers(List<User> users) throws EJBException {
users
.stream()
.forEach(this::addUser);
}
public void addUser(User u) throws EJBException {
try {
if (em != null) {
if (em.isOpen()) {
if (u != null) {
em.persist(u);
} else {
throw (new EJBException("NULL user can not be added"));
}
} else {
throw (new EJBException("EntityManager is closed"));
}
} else {
throw (new EJBException("EntityManager is NULL"));
}
} catch (EntityManagerSetupException e) {
System.out.println("Caught an Exception: "+ e.getMessag();
throw e;
}
}
public List<User> getUsers() throws EJBException{
logger.entering(className, "getUsers()");
List<User> users = null;
try {
if (em != null) {
if (em.isOpen()) {
Query q = em.createNamedQuery("findAllusers");
users = (List<User>) q.getResultList();
for (User user : users){
Date d = user.getDateOfBirth();
if(d == null){
System.out.println("The dob for user "+user.getLasName()+" null);
}
}
} else {
throw (new EJBException("EntityManager is closed"));
}
} else {
throw (new EJBException("EntityManager is NULL"));
}
} catch (EntityManagerSetupException e) {
System.out.println(e.getMessage());
throw new EJBException(e.getMessage());
}
return users;
}
}
@Stateful
公共类LoginRequestSessionBean{
@持久上下文
实体管理器;
公共void addUsers(列表用户)引发EJBException{
使用者
.stream()
.forEach(this::addUser);
}
public void addUser(用户u)抛出EJBException{
试一试{
如果(em!=null){
如果(em.isOpen()){
如果(u!=null){
em.persist(u);
}否则{
抛出(新的EJBException(“无法添加空用户”);
}
}否则{
抛出(新的EJBException(“EntityManager已关闭”);
}
}否则{
抛出(新的EJBException(“EntityManager为空”);
}
}捕获(EntityManagerSetup异常){
System.out.println(“捕获到异常:+e.getMessag();
投掷e;
}
}
public List getUsers()引发EJBException{
输入(className,“getUsers()”);
列表用户=null;
试一试{
如果(em!=null){
如果(em.isOpen()){
Query q=em.createNamedQuery(“findAllusers”);
users=(List)q.getResultList();
for(用户:用户){
Date d=user.getDateOfBirth();
如果(d==null){
System.out.println(“用户的dob”+user.getLasName()+“null”);
}
}
}否则{
抛出(新的EJBException(“EntityManager已关闭”);
}
}否则{
抛出(新的EJBException(“EntityManager为空”);
}
}捕获(EntityManagerSetup异常){
System.out.println(e.getMessage());
抛出新的EJBException(e.getMessage());
}
返回用户;
}
}
你知道如何为
java.util.Date
存储值吗?你发布的代码似乎是正确的。你应该检查User
类中的构造函数是否设置了dateOfBirth
字段。可能不相关,但是为什么你的会话bean是有状态的呢?它看起来实际上并没有维护任何内部状态(EntityManager不计算在内,因为它不是bean实例的私有)。在持久化上下文启动时或尝试持久化或加载用户
实体时,容器日志是否告诉您有用的信息?如果手动将数据输入到该列(持久化上下文脱机),该实体的表是否有正确映射到用户.dateOfBirth
那么,您能用EJB成功地读回它吗?当您的数据加载程序bean添加实体时,该列是否接收值(通过持久性上下文以外的其他方法(例如命令行SQL客户端)进行检查)?用户类中的构造函数?@areus:非常感谢。你解决了这个难题。日期参数没有存储在构造函数中。在我最初的问题中,代码片段是部分的。实体有更多的字段,其中一个字段出现了漏洞。如果你愿意将其作为答案,我将接受。