Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使JPA实体字段在REST环境中不可变_Java_Rest_Jpa_Jersey_Bean Validation - Fatal编程技术网

Java 使JPA实体字段在REST环境中不可变

Java 使JPA实体字段在REST环境中不可变,java,rest,jpa,jersey,bean-validation,Java,Rest,Jpa,Jersey,Bean Validation,Jersey REST web服务有两个简单的JPA实体。基本上,业务项有一个creator,它指向一个用户。序列化时,不一定向客户机显示业务项的创建者,因此存在JsonIgnore注释。假设我允许每个用户通过HTTP PUT请求更新BusinessItem名称,但不允许更新creator值 @Entity public class BusinessItem { @GeneratedValue(strategy = AUTO) @Id Long id; Stri

Jersey REST web服务有两个简单的JPA实体。基本上,业务项有一个creator,它指向一个用户。序列化时,不一定向客户机显示业务项的创建者,因此存在JsonIgnore注释。假设我允许每个用户通过HTTP PUT请求更新BusinessItem名称,但不允许更新creator值

@Entity
public class BusinessItem {
    @GeneratedValue(strategy = AUTO)
    @Id
    Long id;

    String name;

    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "creator_id", nullable = false, updatable = false)
    User creator;
} 

@Entity
public class User {
    @GeneratedValue(strategy = AUTO)
    @Id
    Long id;

    String name;

    @OneToMany(fetch = LAZY, mappedBy = "creator")
    List<PhotoSpot> createdPhotoSpots;
}
@实体
公共类业务项{
@生成值(策略=自动)
@身份证
长id;
字符串名;
@杰索尼奥雷
@许多酮
@JoinColumn(name=“creator\u id”,nullable=false,updateable=false)
用户创建者;
} 
@实体
公共类用户{
@生成值(策略=自动)
@身份证
长id;
字符串名;
@OneToMany(fetch=LAZY,mappedBy=“creator”)
列出CreatedPhotospot;
}
问题在于,一旦从客户机接收到带有JSON主体的PUT请求并进行反序列化,则creator字段将为空。然后,为了更新数据库中的实体,我需要通过业务项id从数据库中检索creator值,在反序列化实体中进行替换,然后将更新应用到数据库。这一切听起来都不像优雅的锅炉盘


对于这种类型的问题,什么样的解决方案才是完美的呢?

在非常简单的应用程序中,服务和实体之间的直接关联可以是一种实用的设计。然而,在许多情况下,这不是一个合适的选择。正确地管理实体关系是进行更结构化设计的一个很好的理由

在标准MVC应用程序的常规设计中,最好不要将实体直接用作通过视图/页面访问的对象(不要混淆,该实体是EJB容器中的对象)。a的实现是一种常见的解决方案(注意,该链接中记录的顺序是用于数据检索操作,而不是更新)。控制器通常承担TransferObject的构造。然后它就变成了一个


REST服务与MVC模式没有太大区别:事实上,这是一种(在Jersey的情况下,尝试添加@JoinColumn(name=“creator\u id”)引用同一列的长creatorId。然后可以直接更新日期DB@StanislavL,我已经修复了JPA,谢谢。JPA实体不是一个企业Java Bean。注意,我修复了文本:我的意思是,它不适合作为JavaBean