java中事务嵌套异常,java - 休眠异常:无法提交JPA事务; 嵌套异常为javax.persistence.RollbackException:提交事务时出错 - 堆栈内存溢出...

我有一个实体类MailingList,源代码如下:

@Data

@Entity

@Table(name = AccountConstants.TABLE_NAME_MAILING_LIST, uniqueConstraints = @UniqueConstraint(columnNames = { "list_name" }))

@EntityListeners(MailingListListener.class)

public class MailingList extends AbstractBaseEntity implements Serializable, BasicEntity {

public static final String MAILINGLIST_PROP_NAME = "list_name";

@Id

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "mail_list_generator")

@SequenceGenerator(name = "mail_list_generator", sequenceName = "mail_list_seq", allocationSize = 1, initialValue = 1)

@Column(name = "id", updatable = false, nullable = false)

private Long id;

@Column(name = "list_name", length = 50, nullable = false, updatable = true)

private String name;

}

您可以看到,上面的实体将侦听器添加到类MailingListListener,下面是MailingListListener的源代码

@Component

public class MailingListListener {

@PrePersist

public void onPrePersist(Object o) {

try {

if (o instanceof Timestampable) {

Timestampable tso = (Timestampable) o;

tso.setCreatedAt(new Date());

tso.setActive(true);

tso.setCreatedBy(getUserId());

}

} catch (Exception e) {

LOGGER.error(e.getMessage(), e);

}

}

private void sendMailingList(MailingList mailingList) {

try {

MailingListVM vm = MailingListMapper.INSTANCE.toMailingListVM(mailingList);

KafkaMessage kafkaMsg = KafkaUtil.saveKafkaMessage(vm, BaseConstants.TABLE_NAME_MAILING_LIST, "uaa");

Map sendingData = new HashMap<>();

if (mailingList.getActive() == null || mailingList.getActive() == false) {

sendingData.put(BaseConstants.KAFKA_ACTION, BaseConstants.KAFKA_ACTION_DELETE);

} else {

sendingData.put(BaseConstants.KAFKA_ACTION, BaseConstants.KAFKA_ACTION_UPDATE);

}

sendingData.put(BaseConstants.TABLE_NAME, BaseConstants.TABLE_NAME_MAILING_LIST + "");

sendingData.put(MailingList.PROP_ID, mailingList.getId().longValue() + "");

sendingData.put(MailingList.MAILINGLIST_PROP_NAME, mailingList.getName());

sendingData.put(MailingList.PROP_CREATED_AT, mailingList.getCreatedAt());

sendingData.put(MailingList.PROP_UPDATED_AT, mailingList.getUpdatedAt());

sendingData.put(KafkaMessage.SOURCE_SERVICE, KafkaMessage.UAA_SERVICE);

sendingData.put(KafkaMessage.KAFKA_MESSAGE_ID, kafkaMsg.getId() != null ? kafkaMsg.getId() + "" : "-1");

UpdatedUaaPublicProducerChannel updatedUaaPublicProducerChannel = ApplicationContextHolder

.getBean(UpdatedUaaPublicProducerChannel.class);

updatedUaaPublicProducerChannel.updateUaaPublic().send(MessageBuilder.withPayload(sendingData).build());

} catch (Exception e) {

LOGGER.info(e.getMessage(), e);

}

}

@PostPersist

public void onPostPersist(Object o) {

MailingList obj = (MailingList) o;

send1MailingList(obj);

}

}

您可以看到代码。 每当我更新或将新记录插入MailingList表中时,它将执行sendMailingList函数。 该功能仅将一条记录保存到表kafka_message表中,并仅向kafka服务器发送一条消息。 但是我不明白如果我注释此函数的2个第一行代码,那么我也可以运行

MailingListVM vm = MailingListMapper.INSTANCE.toMailingListVM(mailingList);

KafkaMessage kafkaMsg = KafkaUtil.saveKafkaMessage(vm, BaseConstants.TABLE_NAME_MAILING_LIST, "uaa");

函数KafkaUtil.saveKafkaMessage内容如下

public final static KafkaMessage saveKafkaMessage(Object dept, String tableName, String source) {

Session session = null;

session = ApplicationContextHolder.getSessionFactory().openSession();

try {

KafkaMessage kafkaMessage = new KafkaMessage();

kafkaMessage.setContents(KafkaUtil.writeValueAsString(dept));

kafkaMessage.setTableName(tableName);

if(source.equals("device")) {

kafkaMessage.setDeviceServiceReceived(new Long(2));

} else if(source.equals("facility")) {

kafkaMessage.setFacilityServiceReceived(new Long(2));

} else if(source.equals("archive")) {

kafkaMessage.setArchiveServiceReceived(new Long(2));

} else if(source.equals("uaa")) {

kafkaMessage.setUaaServiceReceived(new Long(2));

} else if(source.equals("monitoring")) {

kafkaMessage.setMonitoringServiceReceived(new Long(2));

} else if(source.equals("sale")) {

kafkaMessage.setSaleServiceReceived(new Long(2));

}

session = ApplicationContextHolder.getSessionFactory().openSession();

Transaction transaction = null;

transaction = session.beginTransaction();

transaction.begin();

session.save(kafkaMessage);

transaction.commit();

return kafkaMessage;

} finally {

//It will close session to avoid exception that it cannot get connection from pool

if(session != null)

session.close();

}

}

如果您知道解决方法,请帮助我。 非常感谢你的帮助

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值