首页 > 解决方案 > 尝试在 Spring Boot 中从 null 一对一属性分配 id

问题描述

我在spring boot中有这个错误:

试图从空的一对一属性 [com.endoorment.models.entity.ActionLang.action] 分配 id

我的代码:

    @Embeddable
public class ActionLangId implements Serializable {

 private static final long serialVersionUID = 1 L;

 @NotNull
 @Column(name = "actions_id")
 private Integer actionId;

 @NotNull
 @Column(name = "langs_id")
 private Integer langId;

 public ActionLangId() {}

 public ActionLangId(Integer actionId, Integer langId) {
  super();
  this.actionId = actionId;
  this.langId = langId;
 }

 public Integer getActionId() {
  return actionId;
 }

 public void setActionId(Integer actionId) {
  this.actionId = actionId;
 }

 public Integer getLangId() {
  return langId;
 }

 public void setLangId(Integer langId) {
  this.langId = langId;
 }

 @Override
 public boolean equals(Object o) {
  if (this == o) return true;
  if (o == null || getClass() != o.getClass())
   return false;

  ActionLangId that = (ActionLangId) o;
  return Objects.equals(actionId, that.actionId) &&
   Objects.equals(langId, that.langId);
 }

 @Override
 public int hashCode() {
  return Objects.hash(actionId, langId);
 }
}

@Entity
@Table(name = "actions_langs")
public class ActionLang {

 @EmbeddedId
 private ActionLangId id;

 @ManyToOne(fetch = FetchType.LAZY)
 @MapsId("actionId")
 @JoinColumn(name = "actions_id")
 private Action action;

 @ManyToOne(fetch = FetchType.LAZY)
 @MapsId("langId")
 @JoinColumn(name = "langs_id")
 private Lang lang;

 @NotNull(message = "null")
 @Size(max = 45, message = "short")
 private String name;

 public ActionLang() {}

 public ActionLang(ActionLangId actionlangid, String name) {
  this.id = actionlangid;
  this.name = name;
 }


 public ActionLangId getId() {
  return id;
 }

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

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 @Override
 public String toString() {
  return "ActionLang [id=" + id + ", name=" + name + "]";
 }
}

服务:

@Transactional
public ActionLang saveAction(Integer idlang, String name) {

 Integer id = actionRepository.findActionId();

 Action action = new Action(id);
 actionRepository.save(action);

 ActionLang actionlang = new ActionLang(new ActionLangId(id, idlang), name);
 actionlangRepository.save(actionlang);
 return actionlang;
}

Structure actionlang: {
  "id": {
   "actionId": 2,
   "langId": 1
  },
  "name": "hkjhlhklhkllñkñl"

谢谢

标签: javaspringspring-data-jpa

解决方案


我的解决方案,

实体动作:

@Entity 
@Table(name = "actions")
public class Action {

@Id
private Integer id;

    @OneToMany(mappedBy = "action")
    private List<ActionLang> actionlang = new ArrayList<>();

 public Action() { }

public Action(Integer id) {this.id = id;}

public Integer getId() {return id;}

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

public List<ActionLang> getActionLang() {return actionlang;}

public void addActionLang(ActionLang actionlang) {
    this.actionlang.add(actionlang);
}

public void removeActionLang(ActionLang actionlang) {
    this.actionlang.remove(actionlang);
}

@Override
public String toString() {return "id: " + id ;}
}

实体动作语言,

@Entity 
@Table(name = "actions_langs")
public class ActionLang {

@EmbeddedId
private ActionLangId id;

@ManyToOne(fetch = FetchType.LAZY)
@MapsId("actionId")
@JoinColumn(name = "actions_id", nullable = false)
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
private Action action;

@ManyToOne(fetch = FetchType.LAZY)
@MapsId("langId")
@JoinColumn(name = "langs_id", nullable = false)
@OnDelete(action = OnDeleteAction.CASCADE)
@JsonIgnore
private Lang lang;

@NotNull(message="null")
@Size(max = 45, message="short")
private String name;

public ActionLang() {}

public ActionLang(ActionLangId actionlangid, String name) {
    this.id = actionlangid;
    this.name = name;
}

public ActionLangId getId() {return id;}

public String getName() {return name;}

public void setName(String name) {this.name = name;}

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

    public Action getAction() {return action;}

public void setAction(Action action) {this.action = action;}

public Lang getLang() {return lang;}

public void setLang(Lang lang) {    this.lang = lang;   }

@Override
public String toString() {return "ActionLang [id=" + id + ", name=" + name + "]";   }
}

服务

@Component
public class ActionDAOService {

@Autowired
    private IActionDao actionRepository;

@Autowired
    private IActionLangDao actionlangRepository;

@Transactional
public Action saveAction(Integer idlang, String name){

    Lang lang = new Lang();
    lang.setId(idlang);

    Integer id = actionRepository.findActionId();
    if(id == null) {
        id=(Integer) 1;
    }

    Action action = new Action(id);
    actionRepository.save(action);

    ActionLang actionlang = new ActionLang(new ActionLangId(id, idlang),name);
    action.addActionLang(actionlang);
    actionlang.setAction(action);
    actionlang.setLang(lang);

    actionlangRepository.save(actionlang);

    return action;
}
}

推荐阅读