JPA双向映射取值问题解决办法

时间:2021-01-23 14:48:21

1.JPA双向映射取值问题解决办法

1)两个class entity:InboundNodeEntity 和InboundNodeDetailEntity 省略get ,set方法,并且这里的常量是定义在接口中的

@Entity
@Table(name=InboundNodeDbConstants.INBOUND_NODE_TABLE_NAME)
public class InboundNodeEntity implements Serializable
{

/**
* serialVersionUID: Serial version UUID for InboundNodeEntity
* @see
*/
private static final long serialVersionUID = 8875248360699928223L;

@Id
@GeneratedValue(generator = InboundNodeDbConstants.INBOUND_NODE_UUID_GENERATOR_NAME)
@Column(name = InboundNodeDbConstants.GENERATOR_UUID_NAME)
private String guid;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name=InboundNodeDbConstants.INBOUND_NODE_TYPE_GUID, nullable = false)
private InboundType inboundType;

@Column(name=InboundNodeDbConstants.INBOUND_NODE_NODE_GUID)
private String nodeCode;

@Column(name=InboundNodeDbConstants.INBOUND_NODE_CARDINALITY)
private String cardinality;

@Column(name=InboundNodeDbConstants.INBOUND_NODE_LEVEL)
private int level;

@Column(name=InboundNodeDbConstants.INBOUND_NODE_TABLE)
private String tableName;

@Column(name=InboundNodeDbConstants.INBOUND_NODE_IS_RULE_RELEVANT)
private boolean ruleRelevant;

@Column(name=InboundNodeDbConstants.INBOUND_NODE_RULE_OBJECT_NAME)
private String ruleObjectName;

@Column(name=InboundNodeDbConstants.INBOUND_NODE_ENABLED)
private boolean enable;

@Column(name=InboundNodeDbConstants.INBOUND_NODE_DESCRIPTION)
private String description;

@OneToMany(cascade={CascadeType.ALL}, mappedBy="inboundNode")
private Set inboundNodeDetails = new HashSet
@Entity
@Table(name = InboundNodeDetailDbConstant.TABLE_INBOUND_NODE_DETAIL)
public class InboundNodeDetailEntity implements Serializable
{


private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(generator = "system-uuid")
@Column(name = InboundNodeDetailDbConstant.GUID)
private String guid;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = InboundNodeDetailDbConstant.NODE_GUID, nullable = false)
private InboundNodeEntity inboundNode;

@Column(name = InboundNodeDetailDbConstant.ELEMENT_CODE)
private String elementCode;

@Column(name = InboundNodeDetailDbConstant.DATA_TYPE_CODE)
private String dataTypeCode;

@Column(name = InboundNodeDetailDbConstant.IS_MANDATORY)
private boolean isMandatory;

@Column(name = InboundNodeDetailDbConstant.IS_RULERELEVANT)
private boolean isRuleRelevant;

@Column(name = InboundNodeDetailDbConstant.TABLE_NAME)
private String tableName;

@Column(name = InboundNodeDetailDbConstant.COLUM_NNAME)
private String columnName;

@Column(name = InboundNodeDetailDbConstant.IS_ENABLED)
private boolean isEnabled;

@Column(name = InboundNodeDetailDbConstant.IS_ALTERNETIVEKEY)
private boolean isAlternativeKey;

@Column(name = InboundNodeDetailDbConstant.IS_PARENT_KEY)
private boolean isParentKey;

@Column(name = InboundNodeDetailDbConstant.DESCRIPTION)
private String description;

@OneToMany(cascade = {CascadeType.ALL}, mappedBy = "inboundNodeDetailEntity")
private Set<InboundContentEntity> inboundContentEntity;
}

2)controller层去调用

@GetMapping(value = "/nodeDetail/all")
public List<InboundNodeDetailEntityDto> getAllDetails()
{
return nodeDetailService.getAllDetails();
}

3)service层,这里要通过DTO去打断这个互相取值的关联,这样就不会出现一直在取值的问题了!

@Autowired
private InboundNodeDetailEntityRepository nodeDetailRepository;

@Override
public List<InboundNodeDetailEntityDto> getAllDetails()
{
List<InboundNodeDetailEntityDto> inboundNodeDetailEntities = new ArrayList<>();

for (InboundNodeDetailEntity inboundNodeDetailEntity : nodeDetailRepository.findAll())
{
InboundNodeDetailEntityDto inboundNodeDetailEntity2 = new InboundNodeDetailEntityDto();
List<InboundNodeDetailEntityParam> inboundNodeDetailEntityParams = new ArrayList<>();
InboundNodeDetailEntityParam inboundNodeDetailEntityParam = new InboundNodeDetailEntityParam();
inboundNodeDetailEntity2.setNodeGUID(inboundNodeDetailEntity.getInboundNode().getNodeCode());
inboundNodeDetailEntity2.setGuid(inboundNodeDetailEntity.getGuid());
inboundNodeDetailEntityParam.setAlternetiveKey(inboundNodeDetailEntity.getAlternativeKey());
inboundNodeDetailEntityParam.setColumnName(inboundNodeDetailEntity.getColumnName());
inboundNodeDetailEntityParam.setDataTypeCode(inboundNodeDetailEntity.getDataTypeCode());
inboundNodeDetailEntityParam.setDescription(inboundNodeDetailEntity.getDescription());
inboundNodeDetailEntityParam.setElementCode(inboundNodeDetailEntity.getElementCode());
inboundNodeDetailEntityParam.setEnable(inboundNodeDetailEntity.getEnabled());
inboundNodeDetailEntityParam.setMandatory(inboundNodeDetailEntity.getMandatory());
inboundNodeDetailEntityParam.setParentKey(inboundNodeDetailEntity.getParentKey());
inboundNodeDetailEntityParam.setRuleRelevant(inboundNodeDetailEntity.getRuleRelevant());
inboundNodeDetailEntityParam.setTableName(inboundNodeDetailEntity.getTableName());
inboundNodeDetailEntityParams.add(inboundNodeDetailEntityParam);
//inboundNodeDetailEntity2.setInboundNodeDetailEntityParams(inboundNodeDetailEntityParams);
inboundNodeDetailEntities.add(inboundNodeDetailEntity2);
}
return inboundNodeDetailEntities;
}

4)Repository层

@Repository
public interface InboundNodeDetailEntityRepository extends JpaRepository<InboundNodeDetailEntity, String>
{


List<InboundNodeDetailEntity> findAll();

//List<InboundNodeDetailEntity> save(List<InboundNodeDetailEntity> inboundNodeDetailEntities);

@SuppressWarnings("unchecked")
InboundNodeDetailEntity save(InboundNodeDetailEntity inboundNodeDetailEntity);

@Query(value = "select ine from InboundNodeDetailEntity ine where ine.inboundNode.nodeCode = ?1 and ine.elementCode = ?2")
List<InboundNodeDetailEntity> findByNodeGuidAndElementCode(String nodeGuid, String elementCode);

@Query(value = "select ine from InboundNodeDetailEntity ine join ine.inboundNode inNode where inNode.inboundType.typeCode=?1 and ine.inboundNode.nodeCode=?2")
List<InboundNodeDetailEntity> findByTypeCodeAndNodeCode(String typeCode, String nodeCode);
@Query(value = "select * from \"268073BE12C74139B231A938DA1AD6EE\".\"com.sap.ems.db.integration.data::InboundMapping.NodeElement\" element join \"268073BE12C74139B231A938DA1AD6EE\".\"com.sap.ems.db.integration.data::InboundMapping.Node\" node on element.\"NodeGUID\"=node.\"GUID\" WHERE ((\"NodeGUID\" = ?1) AND (\"IsAlternativeKey\" = true)) order by node.\"Level\" desc ",nativeQuery=true)
List<InboundNodeDetailEntity> findAlternativeKeyByNodeGUID(String nodeGUID);
}